package mspool

import (
	"fmt"
	msgLog "gitee.com/MrDaiM/msgo/log"
	"time"
)

type Worker struct {
	pool *Pool

	// 任务队列
	task chan func()

	// lastTime 执行任务的最后时间
	lasTime time.Time
}

func (w *Worker) run() {
	w.pool.incRunning()
	go w.running()
}

func (w *Worker) running() {
	defer func() {
		w.pool.decRunning()
		w.pool.workCache.Put(w) // 放置到syn.pool 并没有放置到w.pool.PutWorker(w) （重试机制）
		if err := recover(); err != nil {
			// 捕获任务发送panic
			if w.pool.PanicHandler != nil {
				w.pool.PanicHandler()
			} else {
				msgLog.Default().Error(err)
			}

		}
		// 解决panic 导致无法通知，后续任务无法执行
		w.pool.cond.Signal()
	}()
	for f := range w.task { // 这里是一直阻塞的
		if f == nil {
			w.pool.workCache.Put(w)
			return // task 中的容量只有一个，如果此work 取出的func 是nil 就不用再循环了
		}
		f()
		// 任务运行完成，worker空闲，移动到协程池
		w.pool.PutWorker(w) // 此方法中有个信号量的通知，f() 一旦发panic 就不会再执行了

	}

	fmt.Println("================================")

}
